package proto

import (
	"fmt"
	"sync"

	"gitee.com/cjianwen/go/logs"
)

type MsgHandler = func(conn *ConnClient, pack *PackData)

type msgHandler struct {
	handles [MaxMsgId]MsgHandler
}

func (m *msgHandler) addMsgHandler(msgId uint32, f MsgHandler) {
	if msgId < MaxMsgId {
		if m.handles[msgId] == nil {
			m.handles[msgId] = f
		} else {
			panic(fmt.Sprintf("添加重复的消息处理函数: msgId = %d", msgId))
		}
	} else {
		panic(fmt.Sprintf("消息Id越界: msgId = %d", msgId))
	}
}

func (m *msgHandler) dispatchMsg(conn *ConnClient, pack *PackData) {
	msgId := pack.Head.Cmd
	if msgId < MaxMsgId {
		if m.handles[msgId] != nil {
			m.handles[msgId](conn, pack)
		}
	} else {
		logs.Warn("dispatchMsg 消息ID越界: %d ", msgId)
	}
}

var instance *msgHandler
var once sync.Once

func getInstance() *msgHandler {
	once.Do(func() {
		instance = &msgHandler{}
	})
	return instance
}

func AddMsgHandler(msgId uint32, f MsgHandler) {
	getInstance().addMsgHandler(msgId, f)
}

func DispatchMsg(conn *ConnClient, pack *PackData) {
	getInstance().dispatchMsg(conn, pack)
}
